// esercitazione_verifica.cpp : Defines the entry point for the console application.
//
/*
scrivere un programma che gestisca la lista delle auto che entrano ed escano da un parchegio delle auto interessa la targa e ora di etrata(stringha)
la lsta è ordinaa per
la targa
1) l' auto vine aggiunta al parcheggio (alloca)
2) uscita dal parcheggio auto eliminata (
3)  visualizza tutte le auto presenti nel parcheggio

*/
#include "stdafx.h"
#include <iostream>
#define LEN 10
using namespace std;
typedef struct {
	char targa[LEN + 1];
	float  entrata=0;

}INFO;
typedef struct NODO {
	INFO macchina;
	struct NODO*next;
}NODO;
bool lista_vuota(NODO*n);
NODO*alloca();
void leggi(NODO*n);
NODO*inserimento_ordinato(NODO*n);
NODO*cancella(NODO*n);
void stampa(NODO*n);
void dealloca(NODO*n);
void menù();
int main()
{
	menù();
    return 0;
}

bool lista_vuota(NODO*n) {
	if (n == NULL) {
		return true;
	}
	else {
		return false;
	}
}
NODO*alloca() {
	NODO*nuovo;
	nuovo = (NODO*)malloc(sizeof(NODO));
	if (nuovo == NULL) {
		printf("Errore di allocamento di memoria, spazio insufficente\n");
		return 0;
	}
	nuovo->next = NULL;
	return nuovo;
	
}
void leggi(NODO*n) {
	printf("inseire targa del veicolo\n");
	scanf_s("%s", n->macchina.targa, LEN + 1);
	printf("inserire  la data di entrata del veicolo \n");
	scanf_s("%f", &n->macchina.entrata, sizeof(float));
	// nelle variabili diverse da stinghe o array 


}
NODO*inserimento_ordinato(NODO*n) {
	NODO*p;
	NODO*prec=NULL;
	NODO*nuovo;
	if (lista_vuota(n) == true) {
		nuovo = alloca();
		leggi(nuovo);
		return nuovo;
	}
	else {
		nuovo = alloca();
		leggi(nuovo);
		p = n;
		while (p != NULL) {
			if (strcmp(p->macchina.targa, nuovo->macchina.targa) == 0 || strcmp(p->macchina.targa, nuovo->macchina.targa) == 1) {
				if (prec == NULL) {
					nuovo->next = p;
					return nuovo;
				}
				else {
					prec->next = nuovo;
					nuovo->next = p;
					break;
				}
			}
			else {
				if (p->next == NULL) {
					p->next = nuovo;
					return n;
				}
			}

				prec = p;
				p = p->next;
			}
		}
	}

NODO*cancella(NODO*n) {
	char auto_eliminare[LEN + 1];
	NODO*p;
	NODO*prec=NULL;
	bool trovato = false;
	// case 1
	if (lista_vuota(n) == true) {
		printf("la lista è vuota \n");
		system("pause");
		return 0;
	}
		printf("inseire la  targa \n");
		scanf_s("%s", auto_eliminare, LEN + 1);
		p = n;
		while (p != NULL)
		{
			if (strcmp(auto_eliminare, p->macchina.targa) == 0) {
				trovato = true;
				if (prec == NULL) {
					// case 2 non precedente 
					if (p->next == NULL) {
						free(p);
						return NULL;
					}
					else {
						// case 2 precedente
						n = p->next;// il nodo succesivo diventa il nodo di testa <
						free(p);
						return n;
					}
				}
				else {
					if (p->next == NULL) {// caso  3 ultimo nodo 
						prec->next = NULL;
						free(p);
						return n;
					}
					else {
						// case 4 nodo di mezzo 
						prec->next = p->next;
						free(p);
						return n;
					}
				}
			}
			prec = p;
			p = p->next;

		}
	

}
void stampa(NODO*n) {
	NODO*p;
	int cont=0;
	p = n;
	while (p != NULL) {
		printf(" il nodo è %d , la targa è %s  e l' ora di enrata è %f\n", cont, p->macchina.targa, p->macchina.entrata);
		cont++;
		p = p->next;
	}

}
void dealloca(NODO*n) {
	NODO*p;//creo un nodo p 
	while (n != 0) {
		p = n;// pongo p =n;
		n = p->next; // pongo n= al nodo dopo p;
		free(p);//dealloco p
		p = NULL;//dico che p è ugguale a niente 
	}
}
void menù() {
	NODO*n=NULL;
	int scelta = 0;
	do {
		system("cls");
		printf("menù\n");
		printf("0.esci\n");
		printf("1.inseirsci\n");
		printf("2. cancella \n");
		printf("3.stampa\n");
		scanf_s("%d", &scelta, sizeof(int));
		switch (scelta) {
		case 0:
			printf("arrivederci e lsciate la mancia\n");
			system("pause");
			break;
		case 1:
			n = inserimento_ordinato(n);
			break;
		case 2:
			n = cancella(n);
			break;
		case 3:
			stampa(n);
			system("pause");
			break;
		default:
			printf("numero non valido\n");
			system("pause");
			break;
		}

	} while (scelta != 0);
	dealloca(n);
}